package main

import (
	"fmt"
	"log"
	"strings"

	"go-file-perception-model/internal/config"
	"go-file-perception-model/internal/logger"
	"go-file-perception-model/internal/service"
	"go-file-perception-model/pkg/embedding"
)

func main() {
	fmt.Println("=== 位置计算改进测试 ===")

	// 初始化日志系统
	logger.InitLogger()

	// 加载配置
	cfg, err := config.LoadConfig()
	if err != nil {
		log.Fatalf("Failed to load config: %v", err)
	}

	// 初始化嵌入模型
	bgeConfig := &embedding.BGEServiceConfig{
		Host:    cfg.BGEService.Host,
		Port:    cfg.BGEService.Port,
		APIKey:  cfg.BGEService.APIKey,
		Timeout: cfg.BGEService.Timeout,
	}
	embeddingModel, err := embedding.NewBGEModel(bgeConfig)
	if err != nil {
		log.Printf("Warning: Failed to initialize embedding model: %v", err)
		embeddingModel = nil
	}

	// 创建测试文本 - 模拟会导致位置计算问题的情况
	testText := `第一条 为了规范省国资委监管企业负责人薪酬管理，建立健全与劳动力市场基本适应、与企业经济效益和劳动生产率挂钩的工资决定和正常增长机制，根据《中华人民共和国公司法》《中华人民共和国企业国有资产法》等法律法规和有关政策规定，结合我省实际情况，制定本办法。

第二条 本办法适用于省国资委履行出资人职责的国有独资企业、国有独资公司、国有控股企业（以下统称监管企业）负责人薪酬管理。

第三条 监管企业负责人薪酬管理应当坚持以下原则：
（一）市场化原则。根据劳动力市场价位和企业经济效益，合理确定薪酬水平。
（二）激励约束并重原则。建立健全激励约束机制，充分调动企业负责人积极性。
（三）公开透明原则。薪酬管理制度和标准应当公开透明，接受监督。

第四条 监管企业负责人薪酬由基本年薪、绩效年薪和任期激励收入三部分构成。基本年薪是企业负责人的年度基本收入。绩效年薪是与企业年度经营业绩考核结果挂钩的浮动收入。任期激励收入是与企业负责人任期经营业绩考核结果挂钩的激励收入。`

	fmt.Printf("测试文本长度: %d 字符\n", len(testText))

	// 测试增强文本分块器
	enhancedChunker := service.NewEnhancedTextChunker(embeddingModel, &cfg.FileIndex)
	chunks, err := enhancedChunker.ChunkText(testText)
	if err != nil {
		log.Fatalf("Failed to chunk text: %v", err)
	}

	fmt.Printf("生成了 %d 个分块\n", len(chunks))

	// 测试位置计算器
	positionCalculator := service.NewPositionCalculator(&cfg.FileIndex)
	positions := positionCalculator.CalculateChunkPositions(testText, chunks, cfg.FileIndex.SemanticChunking)

	fmt.Println("\n=== 位置计算结果 ===")
	
	errorCount := 0
	for i, chunk := range chunks {
		if i >= len(positions) {
			fmt.Printf("❌ 分块 %d: 没有位置信息\n", i+1)
			errorCount++
			continue
		}
		
		pos := positions[i]
		
		// 验证位置是否合理
		if pos.StartPos < 0 || pos.EndPos > len(testText) || pos.StartPos >= pos.EndPos {
			fmt.Printf("❌ 分块 %d: 位置异常 [%d:%d]\n", i+1, pos.StartPos, pos.EndPos)
			errorCount++
			continue
		}
		
		// 验证位置对应的文本是否与分块内容匹配
		actualText := testText[pos.StartPos:pos.EndPos]
		chunkTrimmed := strings.TrimSpace(chunk)
		actualTrimmed := strings.TrimSpace(actualText)
		
		// 检查是否匹配（允许一定的空白字符差异）
		isMatch := actualTrimmed == chunkTrimmed || 
				   strings.Contains(actualTrimmed, chunkTrimmed) || 
				   strings.Contains(chunkTrimmed, actualTrimmed)
		
		if isMatch {
			fmt.Printf("✅ 分块 %d: 位置正确 [%d:%d] 长度=%d\n", 
				i+1, pos.StartPos, pos.EndPos, len(chunk))
		} else {
			fmt.Printf("⚠️  分块 %d: 位置近似 [%d:%d] 长度=%d\n", 
				i+1, pos.StartPos, pos.EndPos, len(chunk))
			
			// 显示前后文本对比
			if len(chunkTrimmed) > 50 {
				fmt.Printf("   分块开头: %s...\n", chunkTrimmed[:50])
			} else {
				fmt.Printf("   分块内容: %s\n", chunkTrimmed)
			}
			
			if len(actualTrimmed) > 50 {
				fmt.Printf("   实际开头: %s...\n", actualTrimmed[:50])
			} else {
				fmt.Printf("   实际内容: %s\n", actualTrimmed)
			}
		}
	}

	fmt.Println("\n=== 测试结果 ===")
	if errorCount == 0 {
		fmt.Println("🎉 所有分块的位置计算都正常！")
		fmt.Println("✅ 位置计算改进成功")
	} else {
		fmt.Printf("⚠️  有 %d 个分块的位置计算存在问题\n", errorCount)
		fmt.Println("但程序不会崩溃，使用了安全的后备方案")
	}
	
	fmt.Printf("总分块数: %d\n", len(chunks))
	fmt.Printf("位置计算成功率: %.1f%%\n", float64(len(chunks)-errorCount)/float64(len(chunks))*100)
}